package mysql

import (
	"fmt"
	"github.com/zeromicro/go-zero/core/logx"
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
	"gorm.io/gorm/logger"
	"log"
	"mall/services/distributed-id/rpc/internal/config"
	"os"
	"time"
)

// InitMysqlDB 加载Mysql驱动
// go get	gorm.io/driver/mysql  // 安装mysql驱动
// go get	gorm.io/gorm
func InitMysqlDB(mysqlInfo *config.MysqlConfig) (*gorm.DB, error) {
	//mysqlInfo := c.MysqlConfig
	dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8mb4&parseTime=True&loc=Local",
		mysqlInfo.Name, mysqlInfo.Password, mysqlInfo.Host,
		mysqlInfo.Port, mysqlInfo.DB)
	c := gorm.Config{PrepareStmt: true}
	// 根据配置打开打印sql日志 打印全部
	if mysqlInfo.PrintSqlLog == "ALL" {
		c.Logger = logger.Default.LogMode(logger.Info)
	} else {
		// 根据配置打开打印sql日志 只打印慢SQL
		slowLogger := logger.New(
			//将标准输出作为Writer
			log.New(os.Stdout, "\r\n", log.LstdFlags),
			logger.Config{
				//设定慢查询时间阈值为mysqlInfo.SlowSqlTime
				SlowThreshold: time.Duration(mysqlInfo.SlowSqlTime) * time.Second,
				//设置日志级别，只有Warn和Info级别会输出慢查询日志
				LogLevel: logger.Warn,
			},
		)
		c.Logger = slowLogger
	}

	// 在执行SQL时都会创建一个prepared statement
	db, _ := gorm.Open(mysql.Open(dsn), &c)
	sqlDB, err := db.DB()
	if err != nil {
		logx.Error(fmt.Sprintf("连接数据失败:%s", err.Error()))
		return nil, err
	}
	// 连接存活时间
	sqlDB.SetConnMaxLifetime(time.Second * time.Duration(mysqlInfo.ConnMaxLifetime))
	// 最大连接数
	sqlDB.SetMaxOpenConns(mysqlInfo.MaxOpen)
	// 最大空闲连接数
	sqlDB.SetMaxIdleConns(mysqlInfo.MaxIdleConn)
	// 最大空时间
	sqlDB.SetConnMaxIdleTime(time.Second * time.Duration(mysqlInfo.ConnMaxIdleTime))
	pingErr := sqlDB.Ping()
	if pingErr != nil {
		logx.Error(fmt.Sprintf("连接数据Ping失败:%s", pingErr.Error()))
		return nil, pingErr
	}
	//db.Use(prometheus.New(prometheus.Config{
	//	DBName:          mysqlInfo.DB,                // 使用 `DBName` 作为指标 label
	//	RefreshInterval: 15,                          // 指标刷新频率（默认为 15 秒）
	//	PushAddr:        "prometheus pusher address", // 如果配置了 `PushAddr`，则推送指标
	//	StartServer:     true,                        // 启用一个 http 服务来暴露指标
	//	HTTPServerPort:  8080,                        // 配置 http 服务监听端口，默认端口为 8080 （如果您配置了多个，只有第一个 `HTTPServerPort` 会被使用）
	//	MetricsCollector: []prometheus.MetricsCollector{
	//		&prometheus.MySQL{
	//			// 指标名前缀，默认为 `gorm_status_`
	//			// 例如： Threads_running 的指标名就是 `gorm_status_Threads_running`
	//			Prefix: "gorm_status_",
	//			// 拉取频率，默认使用 Prometheus 的 RefreshInterval
	//			Interval: 100,
	//			// 从 SHOW STATUS 选择变量变量，如果不设置，则使用全部的状态变量
	//			//VariableNames: []string{"Threads_running"},
	//		},
	//	},
	//}))
	return db, nil
}
